{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "ee3451d1-fbcd-4428-bae7-db2f6cede726",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "start crawler\n",
      "      01        02    03     04   05      06    07    08      09       10  \\\n",
      "0     莘庄       徐泾东  上海南站  上海体育馆   莘庄  东方体育中心   美兰湖  沈杜公路    松江南站      航中路   \n",
      "1    外环路     虹桥火车站   石龙路    宜山路  春申路    灵岩南路  罗南新村   联航路     醉白池      紫藤路   \n",
      "2    莲花路  虹桥2号航站楼站   龙漕路    虹桥路  银都路     上南路   潘广路   江月路  松江体育中心     龙柏新村   \n",
      "3   锦江乐园       淞虹路   漕溪路   延安西路   颛桥    华夏西路    刘行   浦江镇    松江新城    虹桥火车站   \n",
      "4   上海南站       北新泾   宜山路   中山公园   北桥     高青路  顾村公园   芦恒路   松江大学城  虹桥2号航站楼   \n",
      "..   ...       ...   ...    ...  ...     ...   ...   ...     ...      ...   \n",
      "78                               NaN             A             A            \n",
      "79                               NaN                           A      手机版   \n",
      "80                               NaN                           A        A   \n",
      "81                          NaN  NaN                                    A   \n",
      "82                          NaN  NaN                                    A   \n",
      "\n",
      "       11    12     13   14     15    16     17   18    41  \n",
      "0      花桥   金海路    金运路   封浜  紫竹高新区   龙阳路  虹桥火车站   航头  沈杜公路  \n",
      "1     光明路   申江路  金沙江西路  乐秀路    永德路  华夏中路    诸光路   下沙  三鲁公路  \n",
      "2     兆丰路   金京路     丰庄  临洮路    元江路   罗山路    蟠龙路  鹤涛路   闵瑞路  \n",
      "3      安亭  杨高北路  祁连山南路  嘉怡路    双柏路   周浦东    徐盈路  沈梅路   浦航路  \n",
      "4   上海汽车城   巨峰路    真北路  定边路    曙建路  鹤沙航城   徐泾北城  繁荣路  东城一路  \n",
      "..    ...   ...    ...  ...    ...   ...    ...  ...   ...  \n",
      "78                                   NaN    NaN        NaN  \n",
      "79                                   NaN    NaN        NaN  \n",
      "80                                   NaN    NaN        NaN  \n",
      "81    手机版                            NaN    NaN  NaN   NaN  \n",
      "82      A                            NaN    NaN  NaN   NaN  \n",
      "\n",
      "[83 rows x 19 columns]\n"
     ]
    }
   ],
   "source": [
    "#上海地铁路线数据页面\n",
    "import pandas as pd\n",
    "from requests_html import  HTMLSession\n",
    "\n",
    "def get_line():\n",
    "    subway_numbei_list = list(range(1,19))+[41]\n",
    "    subway_numbei_str_list = list( map( lambda x:str(x).rjust(2,'0'),subway_numbei_list ) )#用了类似for循环的功能\n",
    "    sh_rail_url_head = 'http://service.shmetro.com/axlcz'\n",
    "    sh_rail_url_end = '/index.htm'\n",
    "    \n",
    "    sh_rail_url_dict = dict(map(lambda x : (x ,sh_rail_url_head+x+sh_rail_url_end ),subway_numbei_str_list ))\n",
    "    \n",
    "    return sh_rail_url_dict\n",
    "\n",
    "#根据每一条线路的url，在网站上搜出对应的站点\n",
    "def get_stations(line):\n",
    "    site = session.get(line) \n",
    "    line_list = site.html.find('div.linehow',first = True)\n",
    "    station_list = line_list.find('a')\n",
    "    line = []\n",
    "    for station in station_list:\n",
    "        line.append(station.text)\n",
    "    return line\n",
    "\n",
    "df = pd.DataFrame()\n",
    "lines = get_line()\n",
    "print('start crawler')\n",
    "for line in lines.keys():\n",
    "    df[line] = pd.Series(get_stations(lines[line]))\n",
    "df.to_excel('shanghai_rail.xlsx')\n",
    "\n",
    "print(df)\n",
    "    \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a2c4bd54-7189-4c84-8c07-e3ee09f3fa31",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
